<?php
/**
 * DraftsApi
 * PHP version 5
 *
 * @category Class
 * @package  AmazonAdvertisingApi
 * @author   vv_guo
 * @link    https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api
 */

/**
 * Amazon Ads API - Sponsored Brands
 *
 * Use the Amazon Ads API for Sponsored Brands for campaign, ad group, keyword, negative keyword, drafts, Stores, landing pages, and Brands management operations. For more information about Sponsored Brands, see the [Sponsored Brands Support Center](https://advertising.amazon.com/help#GQFZA83P55P747BZ). For onboarding information, see the [account setup](https://advertising.amazon.com/API/docs/v3/guides/account_setup) topic.
 *
 * OpenAPI spec version: 3.0
 * 
 * Generated by:https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api.git
 * AmazonAdvertisingApi Codegen version: 3.0.51
 */
/**
 * NOTE: This class is auto generated by the AmazonAdvertisingApi code generator program.
 *https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api
 * Do not edit the class manually.
 */

namespace AmazonAdvertisingApi\Api;

use GuzzleHttp\Client;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Psr7\MultipartStream;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\RequestOptions;
use AmazonAdvertisingApi\ApiException;
use AmazonAdvertisingApi\Configuration;
use AmazonAdvertisingApi\HeaderSelector;
use AmazonAdvertisingApi\ObjectSerializer;

/**
 * DraftsApi Class Doc Comment
 *
 * @category Class
 * @package  AmazonAdvertisingApi
 * @author   vv_guo
 * @link    https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api
 */
class DraftsApi
{
    /**
     * @var ClientInterface
     */
    protected $client;

    /**
     * @var Configuration
     */
    protected $config;

    /**
     * @var HeaderSelector
     */
    protected $headerSelector;

    /**
     * @param ClientInterface $client
     * @param Configuration   $config
     * @param HeaderSelector  $selector
     */
    public function __construct(
        ClientInterface $client = null,
        Configuration $config = null,
        HeaderSelector $selector = null
    ) {
        $this->client = $client ?: new Client();
        $this->config = $config ?: new Configuration();
        $this->headerSelector = $selector ?: new HeaderSelector();
    }

    /**
     * @return Configuration
     */
    public function getConfig()
    {
        return $this->config;
    }

    /**
     * Operation createDraftCampaigns
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]
     */
    public function createDraftCampaigns($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->createDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation createDraftCampaignsWithHttpInfo
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[], HTTP status code, HTTP response headers (array of strings)
     */
    public function createDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->createDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation createDraftCampaignsAsync
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function createDraftCampaignsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->createDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation createDraftCampaignsAsyncWithHttpInfo
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function createDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->createDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'createDraftCampaigns'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function createDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling createDraftCampaigns'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling createDraftCampaigns'
            );
        }

        $resourcePath = '/sb/drafts/campaigns';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.createdraftcampaignsresponse.v3.2+json', 'application/vnd.createdraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.createdraftcampaignsresponse.v3.2+json', 'application/vnd.createdraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json'],
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.createdraftcampaignsresponse.v3.2+json', 'application/vnd.createdraftcampaignsresponse.v3.3+json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'POST',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation createDraftCampaigns
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]
     */
    public function createDraftCampaigns($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->createDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation createDraftCampaignsWithHttpInfo
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[], HTTP status code, HTTP response headers (array of strings)
     */
    public function createDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->createDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation createDraftCampaignsAsync
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function createDraftCampaignsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->createDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation createDraftCampaignsAsyncWithHttpInfo
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function createDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->createDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'createDraftCampaigns'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function createDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling createDraftCampaigns'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling createDraftCampaigns'
            );
        }

        $resourcePath = '/sb/drafts/campaigns';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.createdraftcampaignsresponse.v3.2+json', 'application/vnd.createdraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.createdraftcampaignsresponse.v3.2+json', 'application/vnd.createdraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json'],
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.createdraftcampaignsresponse.v3.2+json', 'application/vnd.createdraftcampaignsresponse.v3.3+json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'POST',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation createDraftCampaigns
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]
     */
    public function createDraftCampaigns($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->createDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation createDraftCampaignsWithHttpInfo
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[], HTTP status code, HTTP response headers (array of strings)
     */
    public function createDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->createDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation createDraftCampaignsAsync
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function createDraftCampaignsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->createDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation createDraftCampaignsAsyncWithHttpInfo
     *
     * Creates one or more new draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function createDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->createDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'createDraftCampaigns'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SBCreateDraftCampaignRequest[] $body An array of draft campaigns. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function createDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling createDraftCampaigns'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling createDraftCampaigns'
            );
        }

        $resourcePath = '/sb/drafts/campaigns';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.createdraftcampaignsresponse.v3.2+json', 'application/vnd.createdraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.createdraftcampaignsresponse.v3.2+json', 'application/vnd.createdraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json'],
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.createdraftcampaignsresponse.v3.2+json', 'application/vnd.createdraftcampaignsresponse.v3.3+json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'POST',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation deleteDraftCampaign
     *
     * Archives a draft campaign specified by identifier. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $draft_campaign_id The identifier of an existing draft campaign. (required)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBDraftCampaignDeleteResponse
     */
    public function deleteDraftCampaign($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
    {
        list($response) = $this->deleteDraftCampaignWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id);
        return $response;
    }

    /**
     * Operation deleteDraftCampaignWithHttpInfo
     *
     * Archives a draft campaign specified by identifier. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $draft_campaign_id The identifier of an existing draft campaign. (required)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBDraftCampaignDeleteResponse, HTTP status code, HTTP response headers (array of strings)
     */
    public function deleteDraftCampaignWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignDeleteResponse';
        $request = $this->deleteDraftCampaignRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 200:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBDraftCampaignDeleteResponse',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation deleteDraftCampaignAsync
     *
     * Archives a draft campaign specified by identifier. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $draft_campaign_id The identifier of an existing draft campaign. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function deleteDraftCampaignAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
    {
        return $this->deleteDraftCampaignAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation deleteDraftCampaignAsyncWithHttpInfo
     *
     * Archives a draft campaign specified by identifier. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $draft_campaign_id The identifier of an existing draft campaign. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function deleteDraftCampaignAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignDeleteResponse';
        $request = $this->deleteDraftCampaignRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'deleteDraftCampaign'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $draft_campaign_id The identifier of an existing draft campaign. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function deleteDraftCampaignRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling deleteDraftCampaign'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling deleteDraftCampaign'
            );
        }
        // verify the required parameter 'draft_campaign_id' is set
        if ($draft_campaign_id === null || (is_array($draft_campaign_id) && count($draft_campaign_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $draft_campaign_id when calling deleteDraftCampaign'
            );
        }

        $resourcePath = '/sb/drafts/campaigns/{draftCampaignId}';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }

        // path params
        if ($draft_campaign_id !== null) {
            $resourcePath = str_replace(
                '{' . 'draftCampaignId' . '}',
                ObjectSerializer::toPathValue($draft_campaign_id),
                $resourcePath
            );
        }

        // body params
        $_tempBody = null;

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.deletedraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.deletedraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json'],
                []
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'DELETE',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation getDraftCampaign_
     *
     * Gets a draft campaign specified by identifier. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $draft_campaign_id The identifier of an existing draft campaign. (required)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBDraftCampaign
     */
    public function getDraftCampaign_($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
    {
        list($response) = $this->getDraftCampaign_WithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id);
        return $response;
    }

    /**
     * Operation getDraftCampaign_WithHttpInfo
     *
     * Gets a draft campaign specified by identifier. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $draft_campaign_id The identifier of an existing draft campaign. (required)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBDraftCampaign, HTTP status code, HTTP response headers (array of strings)
     */
    public function getDraftCampaign_WithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaign';
        $request = $this->getDraftCampaign_Request($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 200:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBDraftCampaign',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation getDraftCampaign_Async
     *
     * Gets a draft campaign specified by identifier. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $draft_campaign_id The identifier of an existing draft campaign. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function getDraftCampaign_Async($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
    {
        return $this->getDraftCampaign_AsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation getDraftCampaign_AsyncWithHttpInfo
     *
     * Gets a draft campaign specified by identifier. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $draft_campaign_id The identifier of an existing draft campaign. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function getDraftCampaign_AsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaign';
        $request = $this->getDraftCampaign_Request($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'getDraftCampaign_'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $draft_campaign_id The identifier of an existing draft campaign. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function getDraftCampaign_Request($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $draft_campaign_id)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling getDraftCampaign_'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling getDraftCampaign_'
            );
        }
        // verify the required parameter 'draft_campaign_id' is set
        if ($draft_campaign_id === null || (is_array($draft_campaign_id) && count($draft_campaign_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $draft_campaign_id when calling getDraftCampaign_'
            );
        }

        $resourcePath = '/sb/drafts/campaigns/{draftCampaignId}';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }

        // path params
        if ($draft_campaign_id !== null) {
            $resourcePath = str_replace(
                '{' . 'draftCampaignId' . '}',
                ObjectSerializer::toPathValue($draft_campaign_id),
                $resourcePath
            );
        }

        // body params
        $_tempBody = null;

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbdraftcampaign.v3+json', 'application/vnd.sbdraftcampaign.v3.2+json', 'application/vnd.sbdraftcampaign.v3.3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbdraftcampaign.v3+json', 'application/vnd.sbdraftcampaign.v3.2+json', 'application/vnd.sbdraftcampaign.v3.3+json', 'application/vnd.error.v3+json'],
                []
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'GET',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation listDraftCampaigns
     *
     * Gets an array of draft campaign objects. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of draft campaigns. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of draft campaigns in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten ad groups set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten ad groups, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  string $name The returned array only includes draft campaigns with the specified name. (optional)
     * @param  string $draft_campaign_id_filter The returned array includes only draft campaigns with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  string $portfolio_id_filter The returned array includes only campaigns associated with Portfolio identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\AdFormat $ad_format_filter The returned array includes only draft campaigns with ad format matching those specified in the comma-delimited adFormats. Returns all drafts if not specified. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBGetDraftCampaignResponse[]
     */
    public function listDraftCampaigns($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $name = null, $draft_campaign_id_filter = null, $portfolio_id_filter = null, $ad_format_filter = null)
    {
        list($response) = $this->listDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $name, $draft_campaign_id_filter, $portfolio_id_filter, $ad_format_filter);
        return $response;
    }

    /**
     * Operation listDraftCampaignsWithHttpInfo
     *
     * Gets an array of draft campaign objects. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of draft campaigns. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of draft campaigns in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten ad groups set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten ad groups, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  string $name The returned array only includes draft campaigns with the specified name. (optional)
     * @param  string $draft_campaign_id_filter The returned array includes only draft campaigns with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  string $portfolio_id_filter The returned array includes only campaigns associated with Portfolio identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\AdFormat $ad_format_filter The returned array includes only draft campaigns with ad format matching those specified in the comma-delimited adFormats. Returns all drafts if not specified. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBGetDraftCampaignResponse[], HTTP status code, HTTP response headers (array of strings)
     */
    public function listDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $name = null, $draft_campaign_id_filter = null, $portfolio_id_filter = null, $ad_format_filter = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBGetDraftCampaignResponse[]';
        $request = $this->listDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $name, $draft_campaign_id_filter, $portfolio_id_filter, $ad_format_filter);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 200:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBGetDraftCampaignResponse[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation listDraftCampaignsAsync
     *
     * Gets an array of draft campaign objects. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of draft campaigns. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of draft campaigns in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten ad groups set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten ad groups, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  string $name The returned array only includes draft campaigns with the specified name. (optional)
     * @param  string $draft_campaign_id_filter The returned array includes only draft campaigns with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  string $portfolio_id_filter The returned array includes only campaigns associated with Portfolio identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\AdFormat $ad_format_filter The returned array includes only draft campaigns with ad format matching those specified in the comma-delimited adFormats. Returns all drafts if not specified. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function listDraftCampaignsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $name = null, $draft_campaign_id_filter = null, $portfolio_id_filter = null, $ad_format_filter = null)
    {
        return $this->listDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $name, $draft_campaign_id_filter, $portfolio_id_filter, $ad_format_filter)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation listDraftCampaignsAsyncWithHttpInfo
     *
     * Gets an array of draft campaign objects. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of draft campaigns. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of draft campaigns in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten ad groups set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten ad groups, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  string $name The returned array only includes draft campaigns with the specified name. (optional)
     * @param  string $draft_campaign_id_filter The returned array includes only draft campaigns with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  string $portfolio_id_filter The returned array includes only campaigns associated with Portfolio identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\AdFormat $ad_format_filter The returned array includes only draft campaigns with ad format matching those specified in the comma-delimited adFormats. Returns all drafts if not specified. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function listDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $name = null, $draft_campaign_id_filter = null, $portfolio_id_filter = null, $ad_format_filter = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBGetDraftCampaignResponse[]';
        $request = $this->listDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $name, $draft_campaign_id_filter, $portfolio_id_filter, $ad_format_filter);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'listDraftCampaigns'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of draft campaigns. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of draft campaigns in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten ad groups set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten ad groups, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  string $name The returned array only includes draft campaigns with the specified name. (optional)
     * @param  string $draft_campaign_id_filter The returned array includes only draft campaigns with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  string $portfolio_id_filter The returned array includes only campaigns associated with Portfolio identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\AdFormat $ad_format_filter The returned array includes only draft campaigns with ad format matching those specified in the comma-delimited adFormats. Returns all drafts if not specified. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function listDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $name = null, $draft_campaign_id_filter = null, $portfolio_id_filter = null, $ad_format_filter = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling listDraftCampaigns'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling listDraftCampaigns'
            );
        }

        $resourcePath = '/sb/drafts/campaigns';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // query params
        if ($start_index !== null) {
            $queryParams['startIndex'] = ObjectSerializer::toQueryValue($start_index, null);
        }
        // query params
        if ($count !== null) {
            $queryParams['count'] = ObjectSerializer::toQueryValue($count, null);
        }
        // query params
        if ($name !== null) {
            $queryParams['name'] = ObjectSerializer::toQueryValue($name, null);
        }
        // query params
        if ($draft_campaign_id_filter !== null) {
            $queryParams['draftCampaignIdFilter'] = ObjectSerializer::toQueryValue($draft_campaign_id_filter, null);
        }
        // query params
        if ($portfolio_id_filter !== null) {
            $queryParams['portfolioIdFilter'] = ObjectSerializer::toQueryValue($portfolio_id_filter, null);
        }
        // query params
        if ($ad_format_filter !== null) {
            $queryParams['adFormatFilter'] = ObjectSerializer::toQueryValue($ad_format_filter, null);
        }
        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbdraftcampaign.v3+json', 'application/vnd.batchgetdraftcampaignsresponse.v3.2+json', 'application/vnd.batchgetdraftcampaignsresponse.v3.3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbdraftcampaign.v3+json', 'application/vnd.batchgetdraftcampaignsresponse.v3.2+json', 'application/vnd.batchgetdraftcampaignsresponse.v3.3+json'],
                []
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'GET',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation submitDraftCampaign
     *
     * Submits one or more existing draft campaigns to the moderation approval queue. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int[] $body A comma-delimited list of draft campaign identifiers. Maximum length is 10 draft campaign identifiers. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBSubmitDraftCampaignResponse
     */
    public function submitDraftCampaign($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->submitDraftCampaignWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation submitDraftCampaignWithHttpInfo
     *
     * Submits one or more existing draft campaigns to the moderation approval queue. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int[] $body A comma-delimited list of draft campaign identifiers. Maximum length is 10 draft campaign identifiers. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBSubmitDraftCampaignResponse, HTTP status code, HTTP response headers (array of strings)
     */
    public function submitDraftCampaignWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBSubmitDraftCampaignResponse';
        $request = $this->submitDraftCampaignRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBSubmitDraftCampaignResponse',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation submitDraftCampaignAsync
     *
     * Submits one or more existing draft campaigns to the moderation approval queue. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int[] $body A comma-delimited list of draft campaign identifiers. Maximum length is 10 draft campaign identifiers. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function submitDraftCampaignAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->submitDraftCampaignAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation submitDraftCampaignAsyncWithHttpInfo
     *
     * Submits one or more existing draft campaigns to the moderation approval queue. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int[] $body A comma-delimited list of draft campaign identifiers. Maximum length is 10 draft campaign identifiers. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function submitDraftCampaignAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBSubmitDraftCampaignResponse';
        $request = $this->submitDraftCampaignRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'submitDraftCampaign'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int[] $body A comma-delimited list of draft campaign identifiers. Maximum length is 10 draft campaign identifiers. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function submitDraftCampaignRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling submitDraftCampaign'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling submitDraftCampaign'
            );
        }

        $resourcePath = '/sb/drafts/campaigns/submit';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.submitdraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.submitdraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json'],
                ['application/vnd.sbcampaign.v3+json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'POST',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation updateDraftCampaigns
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]
     */
    public function updateDraftCampaigns($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->updateDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation updateDraftCampaignsWithHttpInfo
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[], HTTP status code, HTTP response headers (array of strings)
     */
    public function updateDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->updateDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation updateDraftCampaignsAsync
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function updateDraftCampaignsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->updateDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation updateDraftCampaignsAsyncWithHttpInfo
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function updateDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->updateDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'updateDraftCampaigns'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function updateDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling updateDraftCampaigns'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling updateDraftCampaigns'
            );
        }

        $resourcePath = '/sb/drafts/campaigns';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.updatedraftcampaignsresponse.v3.2+json', 'application/vnd.updatedraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.updatedraftcampaignsresponse.v3.2+json', 'application/vnd.updatedraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json'],
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.updatedraftcampaignsresponse.v3.2+json', 'application/vnd.updatedraftcampaignsresponse.v3.3+json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'PUT',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation updateDraftCampaigns
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]
     */
    public function updateDraftCampaigns($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->updateDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation updateDraftCampaignsWithHttpInfo
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[], HTTP status code, HTTP response headers (array of strings)
     */
    public function updateDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->updateDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation updateDraftCampaignsAsync
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function updateDraftCampaignsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->updateDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation updateDraftCampaignsAsyncWithHttpInfo
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function updateDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->updateDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'updateDraftCampaigns'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function updateDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling updateDraftCampaigns'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling updateDraftCampaigns'
            );
        }

        $resourcePath = '/sb/drafts/campaigns';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.updatedraftcampaignsresponse.v3.2+json', 'application/vnd.updatedraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.updatedraftcampaignsresponse.v3.2+json', 'application/vnd.updatedraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json'],
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.updatedraftcampaignsresponse.v3.2+json', 'application/vnd.updatedraftcampaignsresponse.v3.3+json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'PUT',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation updateDraftCampaigns
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]
     */
    public function updateDraftCampaigns($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->updateDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation updateDraftCampaignsWithHttpInfo
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBDraftCampaignResponse[], HTTP status code, HTTP response headers (array of strings)
     */
    public function updateDraftCampaignsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->updateDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation updateDraftCampaignsAsync
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function updateDraftCampaignsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->updateDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation updateDraftCampaignsAsyncWithHttpInfo
     *
     * Updates one or more draft campaigns. [PLANNED SHUTOFF DATE 1/31/2024]
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function updateDraftCampaignsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBDraftCampaignResponse[]';
        $request = $this->updateDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'updateDraftCampaigns'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  null[] $body An array of draft campaign objects with updated values. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function updateDraftCampaignsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling updateDraftCampaigns'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling updateDraftCampaigns'
            );
        }

        $resourcePath = '/sb/drafts/campaigns';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.updatedraftcampaignsresponse.v3.2+json', 'application/vnd.updatedraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.updatedraftcampaignsresponse.v3.2+json', 'application/vnd.updatedraftcampaignsresponse.v3.3+json', 'application/vnd.error.v3+json'],
                ['application/vnd.sbdraftcampaignresponse.v3+json', 'application/vnd.updatedraftcampaignsresponse.v3.2+json', 'application/vnd.updatedraftcampaignsresponse.v3.3+json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'PUT',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Create http client option
     *
     * @throws \RuntimeException on file opening failure
     * @return array of http client options
     */
    protected function createHttpClientOption()
    {
        $options = [];
        if ($this->config->getDebug()) {
            $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a');
            if (!$options[RequestOptions::DEBUG]) {
                throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile());
            }
        }

        return $options;
    }
}
